查看原文
其他

【爬虫实战】Python爬取知网文献信息

爬虫俱乐部 Stata and Python数据分析 2023-10-24

本文作者:金点,中南财经政法大学金融学院

本文编辑:胡艺粼

技术总编:孙一博

Stata and Python 数据分析

爬虫俱乐部Stata基础课程Stata进阶课程Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~
引言

临近毕业季,想必很多今年毕业的朋友们最近都在焦头烂额地忙着撰写论文吧。那么如何高效地了解研究领域的热点问题,学习优秀论文解决问题的思路和方法呢?我们可以使用“知网”这个众所周知的平台来进行文献的检索与阅读。使用python可以更加有效地实现文献信息的爬取。通过快速浏览相关领域文献的基本信息,我们可以从中找出感兴趣的值得我们深入研究的文章再来进行精读,极大地提高了效率。

01选择合适的待爬取网站
我们日常使用知网的网址为:https://www.cnki.net/。但是该网址难以获取网页源代码。右键“查看网页源代码”后会跳转到如下的页面:

但是,我们发现可以从知网空间获取网页源代码。知网空间是知网的一个搜索入口,常用于文献的快速检索,网址为:https://search.cnki.com.cn/

02目标页面分析

以“金融科技”为例,点击搜索,对页面进行分析,按F12选择Fetch/XHR。我们找到了如下发送的请求,且发现是以post方式发送。

且携带的参数为:'searchType': 'MulityTermsSearch', 'Article Type': '', 'ReSearch': '', 'ParamIsNullOrEmpty': 'false', 'Islegal': 'false', 'Content': '金融科技', 'Theme': '', 'Title': '', 'KeyWd': '', 'Author': '', 'SearchFund': '', 'Originate': '', 'Summary': '', 'PublishTimeBegin': '', 'PublishTimeEnd': '', 'MapNumber': '', 'Name': '', 'Issn': '', 'Cn': '', 'Unit': '', 'Public': '', 'Boss': '', 'FirstBoss': '', 'Catalog': '', 'Reference': '', 'Speciality': '', 'Type': '', 'Subject': '', 'SpecialityCode': '', 'UnitCode': '', 'Year': '', 'AcefuthorFilter': '', 'BossCode': '', 'Fund': '', 'Level': '', 'Elite': '', 'Organization': '', 'Order': '1', 'Page': '1', 'PageIndex': '', 'ExcludeField': '', 'ZtCode': '', 'Smarts': '',

03获取相应内容
base_url = 'http://search.cnki.com.cn/Search/ListResult'headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
}

def get_page_text(url, headers, search_word, page_num): data = { 'searchType': 'MulityTermsSearch', 'ArticleType': '', 'ReSearch': '', 'ParamIsNullOrEmpty': 'false', 'Islegal': 'false', 'Content': search_word, 'Theme': '', 'Title': '', 'KeyWd': '', 'Author': '', 'SearchFund': '', 'Originate': '', 'Summary': '', 'PublishTimeBegin': '', 'PublishTimeEnd': '', 'MapNumber': '', 'Name': '', 'Issn': '', 'Cn': '', 'Unit': '', 'Public': '', 'Boss': '', 'FirstBoss': '', 'Catalog': '', 'Reference': '', 'Speciality': '', 'Type': '', 'Subject': '', 'SpecialityCode': '', 'UnitCode': '', 'Year': '', 'AcefuthorFilter': '', 'BossCode': '', 'Fund': '', 'Level': '', 'Elite': '', 'Organization': '', 'Order': '1', 'Page': str(page_num), 'PageIndex': '', 'ExcludeField': '', 'ZtCode': '', 'Smarts': '', }
response = requests.post(url=url, headers=headers, data=data) page_text = response.text return page_text
04解析内容

这里我们运用Xpath进行解析:

代码如下:

def list_to_str(my_list): my_str = "".join(my_list) return my_str
def get_abstract(url): response = requests.get(url=url, headers=headers) page_text = response.text tree = etree.HTML(page_text) abstract = tree.xpath('//div[@class="xx_font"]//text()') return abstract
def parse_page_text(page_text): tree = etree.HTML(page_text) item_list = tree.xpath('//div[@class="list-item"]') page_info = [] for item in item_list: # 标题 title = list_to_str(item.xpath( './p[@class="tit clearfix"]/a[@class="left"]/@title')) # 链接 link = 'https:' +\ list_to_str(item.xpath( './p[@class="tit clearfix"]/a[@class="left"]/@href')) # 作者 author = list_to_str(item.xpath( './p[@class="source"]/span[1]/@title')) # 出版日期 date = list_to_str(item.xpath( './p[@class="source"]/span[last()-1]/text() | ./p[@class="source"]/a[2]/span[1]/text() ')) # 关键词 keywords = list_to_str(item.xpath( './div[@class="info"]/p[@class="info_left left"]/a[1]/@data-key')) # 摘要 abstract = list_to_str(get_abstract(url=link)) # 文献来源 paper_source = list_to_str(item.xpath( './p[@class="source"]/span[last()-2]/text() | ./p[@class="source"]/a[1]/span[1]/text() ')) # 文献类型 paper_type = list_to_str(item.xpath( './p[@class="source"]/span[last()]/text()')) # 下载量 download = list_to_str(item.xpath( './div[@class="info"]/p[@class="info_right right"]/span[@class="time1"]/text()')) # 被引量 refer = list_to_str(item.xpath( './div[@class="info"]/p[@class="info_right right"]/span[@class="time2"]/text()'))
item_info = [i.strip() for i in [title, author, paper_source, paper_type, date, abstract, keywords, download, refer, link]] page_info.append(item_info) print(page_info) return page_info

运行结果如下:

05
保存数据

这里我们将数据保存至excel表格中,并且实现,每个搜索词都在单独的一个sheet中,具体代码如下:

def write_to_excel(workbook, info, search_word):
wb = workbook worksheet1 = wb.add_worksheet(search_word) # 创建子表 worksheet1.activate() # 激活表
title = ['title', 'author', 'paper_source', 'paper_type', 'date', 'abstract', 'keywords', 'download', 'refer', 'link'] # 设置表头 worksheet1.write_row('A1', title) # 从A1单元格开始写入表头
i = 2 # 从第二行开始写入数据 for j in range(len(info)): insert_data = info[j] start_pos = 'A' + str(i) # print(insert_data) worksheet1.write_row(start_pos, insert_data) i += 1 return True
06结果展示

接着我们尝试爬取搜索词为“金融科技”和“数字经济”的前5页文献。

代码运行效果如下:

生成的excel表格如下:

以上就是小编带领大家爬取知网文献信息的全过程了,需要的小伙伴快动手演练一下吧~

END

重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。



对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!







往期推文推荐焕新升级!轻松获取港股、权证的历史交易数据
爬虫俱乐部的精彩答疑---cntraveltime【爬虫俱乐部新命令速递】在Stata中与ChatGPT对话

用`fs`命令批量获取文件夹和不同文件夹下的excel文件

自然语言处理之实例应用

JSON帮手,FeHelper

最新、最热门的命令这里都有!

Python实现微信自动回复告诉python,我想“狂飙”了——线程池与异步协程为爬虫提速高级函数——map()和reduce()

Stata绘制条形图的进阶用法

快来看看武汉的房价是不是又双叒叕涨了!Python 常见内置函数(二)

Stata绘制饼形图的进阶用法

Python标准库--logging模块盲区探索——Stata的读写极限Camelot提取PDF表格:一页多表、多页一表
     关于我们 

   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存